package llm

import (
	"bytes"
	"encoding/json"
	"errors"
	"net/http"
	"time"

	"gitee.com/liuyun-luo/MagicStreamMovies/Server/config"
	"github.com/gin-gonic/gin"
)

type LLMBaseOutputDTO struct {
	//用户发送到网站的消息
	UserMessage string `json:"user_message"`
	//系统要求语
	SystemMessage string `json:"system_message"`
	//AI返回到结果的格式
	ResultFormat string `json:"result_format"`
	//提示语
	Prompt string `json:"prompt"`
}

type Keyword struct {
	Word  string `json:"word"`
	Count uint64 `json:"count"`
}

type KeywordAIResultFormat struct {
	//人物关键词
	CharacterKeywords []Keyword `json:"character_keywords"`
	//地点关键词
	LocationKeywords []Keyword `json:"location_keywords"`
	//情节关键词
	PlotPointKeywords []Keyword `json:"plot_point_keywords"`
	//情感关键词
	EmotionKeywords []Keyword `json:"emotion_keywords"`
	//视听关键词
	AudioVisualKeywords []Keyword `json:"audio_visual_keywords"`
	//电影内容表达
	MovieContentExpressionKeywords []Keyword `json:"movie_content_expression_keywords"`
	//电影世界观
	MovieWorldviewKeywords []Keyword `json:"movie_worldview_keywords"`
	//与电影相关的其他作品（比如：电影改编自什么，和其他电影/动画/小说等之间的关系）
	MovieRelatedRorksKeywords []Keyword `json:"movie_related_rocks_keywords"`

	//其他
	OtherKeywords []Keyword `json:"other_keywords"`
}

// 把提示词喂给AI，获得返回结果
func GetMessageFromAI(prompt string, ctx *gin.Context) (string, error) {
	if config.OPENAI_API_KEY == "" {
		return "", errors.New("OPENAI_API_KEY不能为空")
	}

	//定义发送给AI的提示的格式
	type Messages struct {
		Role    string `json:"role"`
		Content string `json:"content"`
	}

	type sendMessage struct {
		Model    string     `json:"model"`
		Messages []Messages `json:"messages"`
	}

	send_message := sendMessage{
		Model: "deepseek-chat",
		Messages: []Messages{
			{Role: "user",
				Content: prompt},
		},
	}

	prompt_json, err := json.MarshalIndent(send_message, "", " ")
	if err != nil {
		return "", err
	}

	// 创建自定义HTTP客户端，设置超时
	client := &http.Client{
		Timeout: 30 * time.Second,
	}

	// 3. 构建请求对象
	req, _ := http.NewRequest("POST", "https://api.deepseek.com/chat/completions", bytes.NewBuffer(prompt_json))

	// 设置请求头
	req.Header.Set("Content-Type", "application/json")

	req.Header.Set("Authorization", "Bearer "+config.OPENAI_API_KEY) // 认证头

	// 4. 发送请求
	resp, err := client.Do(req)
	if err != nil {
		return "", err
	}
	defer resp.Body.Close()

	// 定义结构体来匹配 API 响应
	type Message struct {
		Content string `json:"content"` // 注意：这里先定义为字符串，因为它本身是一个 JSON 字符串
		Role    string `json:"role"`
	}

	type Choice struct {
		FinishReason string      `json:"finish_reason"`
		Index        int         `json:"index"`
		Logprobs     interface{} `json:"logprobs"` // 使用 interface{} 因为该字段可能为 null 或不同类型
		Message      Message     `json:"message"`
	}

	// 定义结构体来匹配最外层的 JSON 结构
	type APIResponse struct {
		Choices []Choice `json:"choices"`
	}

	var result APIResponse

	// 5. 处理响应
	json.NewDecoder(resp.Body).Decode(&result)

	return result.Choices[0].Message.Content, nil
}
